﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RepositorioSATT.Conexiones;
using System.Data;
using DominioSATT;

namespace RepositorioSATT
{
    public class TorneoRepositorio : ITorneoRepositorio, IMapeadorFila<Torneo>
    {
        protected Conexion conn;
        protected string sql;
        public TorneoRepositorio()
        {
            conn = new Conexion();
        }
        #region Miembros de ITorneoRepositorio

        public string[][] Listar(int IdEvento)
        {
            sql = " Select C.Nombre as NombreCat, T.Tipo, T.Sexo, T.Estado From Torneos T Inner Join Categorias C On T.IdCategoria = C.IdCategoria Where T.IdEvento = " + IdEvento;
            DataTable dt = conn.Listar(sql);
            string[][] Lista = new string[dt.Rows.Count][];
            int i = 0;
            foreach (System.Data.DataRow dr in dt.Rows)
            {
                string[] Torneo = new string[] { dr["NombreCat"].ToString(), dr["Tipo"].ToString(), dr["Sexo"].ToString(), dr["Estado"].ToString() };
                Lista[i] = Torneo;
                i++;
            }
            return Lista;
        }

        public string[][] ListarTorneosAbiertos(int IdEvento)
        {
            sql = " Select C.Nombre as NombreCat, T.Tipo, T.Sexo, T.Estado From Torneos T Inner Join Categorias C On T.IdCategoria = C.IdCategoria Where T.IdEvento = " + IdEvento + " And Estado = 'Abierto para Inscripción'";
            DataTable dt = conn.Listar(sql);
            string[][] Lista = new string[dt.Rows.Count][];
            int i = 0;
            foreach (System.Data.DataRow dr in dt.Rows)
            {
                string[] Torneo = new string[] { dr["NombreCat"].ToString(), dr["Tipo"].ToString(), dr["Sexo"].ToString(), dr["Estado"].ToString() };
                Lista[i] = Torneo;
                i++;
            }
            return Lista;
        }

        public string[][] ListarTorneosPorCerrar()
        {
            sql = " Select C.Nombre as NombreCat, T.Tipo, T.Sexo, T.FecFinInsc, E.Nombre From Torneos T ";
            sql += " Inner Join Categorias C On T.IdCategoria = C.IdCategoria Inner Join Eventos E ";
            sql += " On T.IdEvento = E.IdEvento Where T.Estado = 'Abierto para Inscripción' And FecFinInsc ";
            sql += " > '" + string.Format("{0:yyyyMMdd}", DateTime.Today) + "'";
            DataTable dt = conn.Listar(sql);
            string[][] Lista = new string[dt.Rows.Count][];
            int i = 0;
            foreach (System.Data.DataRow dr in dt.Rows)
            {
                string[] Torneo = new string[] { dr["NombreCat"].ToString(), dr["Tipo"].ToString(), dr["Sexo"].ToString(), dr["FecFinInsc"].ToString(), dr["Nombre"].ToString() };
                Lista[i] = Torneo;
                i++;
            }
            return Lista;
        }

        public Torneo Obtener(int IdEvento, string Categoria, string Tipo, string Sexo)
        {
            ICategoriaRepositorio repoCategoria = new CategoriaRepositorio();
            int IdCat = repoCategoria.ObtenerId(Categoria);
            sql = " Select * From Torneos T Inner Join Categorias C On T.IdCategoria = C.IdCategoria Where T.IdEvento = " + IdEvento +
                " And T.IdCategoria = " + IdCat + " And T.Tipo = '" + Tipo + "' And Sexo = '" + Sexo + "'"; 
            DataRow dr = conn.Buscar(sql);
            return this.MapearTabla(dr);
        }

        public Torneo ObtenerPorId(int IdTorneo)
        {
            sql = " Select * From Torneos Where IdTorneo = " + IdTorneo;
            DataRow dr = conn.Buscar(sql);
            return this.MapearTabla(dr);
        }

        public int Agregar(Torneo Objeto)
        {
            ICategoriaRepositorio categoriaRepo = new CategoriaRepositorio();
            int idCategoria = categoriaRepo.ObtenerId(Objeto.Categoria.Nombre);
            string valores = Objeto.Evento.Id + "," + idCategoria + ",'" + Objeto.Tipo + "','" + Objeto.Sexo + "','" + string.Format("{0:yyyyMMdd}",Objeto.FechaInicio) +
                "','" + string.Format("{0:yyyyMMdd}",Objeto.FechaFin) + "','" + string.Format("{0:yyyyMMdd}",Objeto.FechaInicioInscripcion) + "','" + string.Format("{0:yyyyMMdd}",Objeto.FechaFinInscripcion) + "'," +
                Objeto.Cupo + ",'" + Objeto.Estado + "'";
            return conn.Agregar("Torneos", "IdEvento,IdCategoria,Tipo,Sexo,FecInicio,FecFin,FecInicioInsc,FecFinInsc,Cupo,Estado", valores);
        }

        public void Modificar(Torneo Objeto)
        {
            ICategoriaRepositorio categoriaRepo = new CategoriaRepositorio();
            int idCategoria = categoriaRepo.ObtenerId(Objeto.Categoria.Nombre);
            sql = " Update Torneos Set IdEvento = " + Objeto.Evento.Id + " ,IdCategoria = " + idCategoria + " ,Tipo = '" + Objeto.Tipo + 
                "' , Sexo = '" + Objeto.Sexo + "',FecInicio = '" + string.Format("{0:yyyyMMdd}",Objeto.FechaInicio) + "',FecFin ='" + string.Format("{0:yyyyMMdd}",Objeto.FechaFin) + "',FecInicioInsc = '" +
                string.Format("{0:yyyyMMdd}",Objeto.FechaInicioInscripcion) + "',FecFinInsc = '" + string.Format("{0:yyyyMMdd}",Objeto.FechaFinInscripcion) + "',Cupo = " + Objeto.Cupo + ",Estado = '" +
                Objeto.Estado + "'";
            conn.ActualizarOEliminar(sql);
        }

        public DataTable RankigVarones()
        {
            sql = "SELECT 1 as Posicion,F.NOMBRE AS Federacion,P.dni as NroJugador,P.Nombre + ' ' + P.Apellido as Apellido,P.FechaNac,0 as Subtotal,0 as TJ,0 as TC,0 as Total FROM PERSONA P INNER JOIN PERSONACLUB C ON P.DNI = C.DNI INNER JOIN Club B on C.IDCLUB = B.Idclub INNER JOIN FEDERACION F ON B.IdFederacion = F.IdFederacion WHERE TIPO = 'Afiliado'";
            DataTable dt = conn.Listar(sql);
            return dt;
        }

        #endregion

        #region Miembros de IMapeadorFila<Torneo>

        public Torneo MapearTabla(DataRow fila)
        {
            Torneo retorno = null;
            if (fila != null)
            {
                IEventoRepositorio eventoRepo = new EventoRepositorio();
                Evento bEvento = eventoRepo.Obtener(Convert.ToInt32(fila["IdEvento"]));
                ICategoriaRepositorio categoriaRepo = new CategoriaRepositorio();
                Categoria bCat = categoriaRepo.Obtener(Convert.ToInt32(fila["IdCategoria"]));
                retorno = new Torneo((fila.IsNull("IdTorneo") == true ? 0 : Convert.ToInt32(fila["IdTorneo"])),
                    bEvento, (fila.IsNull("FecInicio") == true ? DateTime.Now : Convert.ToDateTime(fila["FecInicio"])),
                    (fila.IsNull("FecFin") == true ? DateTime.Now : Convert.ToDateTime(fila["FecFin"])),
                    (fila.IsNull("FecInicioInsc") == true ? DateTime.Now : Convert.ToDateTime(fila["FecInicioInsc"])),
                    (fila.IsNull("FecFinInsc") == true ? DateTime.Now : Convert.ToDateTime(fila["FecFinInsc"])),
                    (fila.IsNull("Tipo") == true ? string.Empty : fila["Tipo"].ToString()),
                    (fila.IsNull("Cupo") == true ? 0 : Convert.ToInt32(fila["Cupo"])), bCat,
                    (fila.IsNull("Sexo") == true ? string.Empty : fila["Sexo"].ToString()),
                    (fila.IsNull("Estado") == true ? string.Empty : fila["Estado"].ToString()));
            }
            return retorno;
        }

        #endregion
    }
}
